local smg=require"skynet.smg"
local skynet=require"skynet"

local M={}
M.WAIT_0=0
for i=1,9 do
	M["WAIT_"..i]=i
end
M.WAIT_10=10
M.EVENT={
	INIT=0,
	EXIT=1,
}

local function wait(fork,event,func,n)
	local srv=assert(smg.queryservice("service_eventd"))
	srv.req.ready(event)
	skynet.fork(function ()
		srv.wait.wait(event,n)
		if fork then--不需要顺序执行的回调
			skynet.fork(func)
		else--需要顺序执行的回调
			func()
		end
		srv.req.next(event)
	end)
end

function M.on_event(event)
	local srv=assert(smg.queryservice("service_eventd"))
	srv.req.on_event(event)
end

function M.listen(event,func,n)
	wait(false,event,func,n)
end

function M.fork_listen(event,func,n)
	wait(true,event,func,n)
end

function M.create_closure(event,fork)
	return function(func,n)
		wait(fork,event,func,n)
	end
end

M.wait_init=M.create_closure(M.EVENT.INIT,false)
M.fork_wait_init=M.create_closure(M.EVENT.INIT,true)

M.wait_exit=M.create_closure(M.EVENT.EXIT,false)
M.fork_wait_exit=M.create_closure(M.EVENT.EXIT,true)

return M
